home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 …ember: Reference Library / Dev.CD Dec 00 RL Disk 1.toast / pc / technical documentation / develop / develop issue 26 / develop issue 26 code / qt conferencing code / watcher & 'caster / caster.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-26  |  11.8 KB  |  534 lines

  1. /*
  2.      File:        Caster.c
  3.                  Main source file for Caster, a sample QuickTime Conferencing application
  4.                  Loosely on Philco, a SeeWorld extravaganza, courtesy Guy Riddle.
  5.  
  6.      Copyright:    © 1995 by Apple Computer, Inc.
  7.                  All rights reserved.
  8. */
  9.  
  10. #define     SystemSevenOrLater 1
  11. #include <DiskInit.h>
  12. #include <Fonts.h>
  13. #include <Resources.h>
  14. #include <AppleEvents.h>
  15. #include <ToolUtils.h>
  16. #include <SegLoad.h>
  17. #include <Devices.h>
  18. #include <String.h>
  19. #include <OSUtils.h>
  20. #include <Scrap.h>
  21.  
  22. #include "QuickTimeConferencing.h"
  23. #include "caster.h"
  24. #include "casting.h"
  25. #include "shared.h"
  26.  
  27. /* Prototypes ******************************************/
  28. void                 InitMac( void );
  29. ComponentResult     InitApp( void );
  30.  
  31. void        EndApp( void );
  32. DialogPtr    OpenSplashScreen( void );
  33. void         EventLoop( void );
  34.  
  35. ComponentResult        ProcessUserEvent( void );
  36. ComponentResult        HandleMouseDown( EventRecord* currEvent );
  37. ComponentResult        HandleKeyDown( EventRecord* currEvent );
  38. ComponentResult        HandleHighLevelEvent( EventRecord* currEvent);
  39. ComponentResult        HandleDiskEvent( EventRecord*    currEvent );
  40.  
  41. void                AdjustMenus( void );
  42. ComponentResult        HandleMenuItem( long    selection );
  43. ComponentResult        HandleAppleMenu( short menuItem );
  44. ComponentResult        HandleFileMenu( short menuItem );
  45. ComponentResult        HandleEditMenu( short menuItem );
  46. ComponentResult        HandleSettingsMenu( short menuItem );
  47. ComponentResult     DoNetworkSettings( void );
  48.  
  49. /* Globals *****************************************/
  50. WindowPtr         gMainWindow;
  51. SeqGrabComponent gSequenceGrabber;
  52. SGChannel         gVideoChannel;
  53. SGChannel         gSoundChannel;
  54. CastRecord*         gCastRecord;
  55. Str63             gCastName;
  56.  
  57. /*************************************************** 
  58.  Main 
  59. ****************************************************/
  60. void main( void ) {
  61.  
  62.     DialogPtr splash;
  63.     ComponentResult err = noErr;
  64.     
  65.     InitMac();
  66.     
  67.     splash = OpenSplashScreen();
  68.     
  69.     err = InitApp();
  70.     
  71.     if (splash)
  72.         DisposDialog(splash);
  73.     
  74.     if (err == noErr)    
  75.         EventLoop(); 
  76.     else
  77.         DisplayErrorAlert( err );
  78.         
  79.     EndApp();
  80.     ExitToShell();        
  81. }
  82.  
  83. /*************************************************** 
  84.  InitMac 
  85. ****************************************************/
  86. void InitMac( void ) {
  87.  
  88.     InitGraf((Ptr) &qd.thePort);
  89.     InitFonts();
  90.     InitWindows();
  91.     InitMenus();
  92.     TEInit();
  93.     InitDialogs(nil);
  94.     InitCursor();
  95.     EnterMovies();
  96. }
  97.  
  98. /*************************************************** 
  99.  InitMac 
  100. ****************************************************/
  101. ComponentResult InitApp( void ) {
  102.  
  103.     ComponentResult    result = noErr;
  104.     Handle        menuBar;
  105.  
  106.     menuBar = GetNewMBar(kMenuBarID);
  107.     if (menuBar)
  108.         {
  109.         SetMenuBar(menuBar);
  110.         DisposHandle(menuBar);
  111.         AddResMenu(GetMHandle(kAppleMenuID), 'DRVR');
  112.         DrawMenuBar();
  113.         }
  114.     else
  115.         result = ResError();
  116.     
  117.     GetUserName( gCastName );
  118.  
  119.     gMainWindow = GetNewCWindow(kMainWindowID, nil, (WindowPtr)-1);
  120.     
  121.     if (gMainWindow == nil)
  122.         result = resNotFound; /* can't get the main window */
  123.     else
  124.         SetWTitle( gMainWindow, gCastName );
  125.         
  126.     if ((result == noErr) && gMainWindow)
  127.         result = SetupSequenceGrabber( &gSequenceGrabber, &gSoundChannel, &gVideoChannel, nil );
  128.  
  129.     if (result == noErr)
  130.         result = OpenCast( gMainWindow, gSequenceGrabber, &gCastRecord );
  131.         
  132.     if (result == noErr)
  133.         ShowWindow( gMainWindow );
  134.         
  135.     return result;    
  136. }
  137.  
  138. /*************************************************** 
  139.  EndApp 
  140. ****************************************************/
  141. void    EndApp( void ) {
  142.  
  143.     CloseCast( gCastRecord );
  144.     DisposeWindow( gMainWindow );
  145.     ExitMovies();    
  146.     
  147. }
  148.  
  149. /*************************************************** 
  150.  EventLoop 
  151. ****************************************************/
  152. void EventLoop( void ) {
  153.  
  154.     ComponentResult  err = noErr;
  155.     
  156.     do {
  157.     
  158.         CheckCast( gCastRecord);
  159.         err = ProcessUserEvent();
  160.         DisplayErrorAlert( err );
  161.         
  162.     } while ( err != kTimeToQuit );
  163. }
  164.  
  165. /*************************************************** 
  166.  ProcessUserEvent 
  167. ****************************************************/
  168. ComponentResult        ProcessUserEvent( void ) {
  169.  
  170.     ComponentResult err = noErr;
  171.     EventRecord        currEvent;
  172.     Boolean            handled;
  173.     
  174.     WaitNextEvent(everyEvent, &currEvent, 1, 0);
  175.     
  176.     handled = IsCastEvent( gCastRecord, &currEvent );
  177.     
  178.     if( !handled )
  179.         {
  180.         switch (currEvent.what) {
  181.             case    mouseDown:
  182.                 err = HandleMouseDown( &currEvent );
  183.                 break;
  184.                 
  185.             case    keyDown:
  186.                 err = HandleKeyDown( &currEvent );
  187.                 break;
  188.                 
  189.             case    kHighLevelEvent:
  190.                 err = HandleHighLevelEvent( &currEvent);
  191.                 break;
  192.                 
  193.             case diskEvt:
  194.                 err = HandleDiskEvent( &currEvent );
  195.                 break;
  196.             
  197.             default:
  198.                 break;
  199.             }
  200.         }
  201.     return err;
  202. }
  203.  
  204.  
  205. /*************************************************** 
  206.  HandleMouseDown 
  207. ****************************************************/
  208. ComponentResult    HandleMouseDown( EventRecord* currEvent ) {
  209.  
  210.     ComponentResult         err = noErr;
  211.     WindowPtr                eventWindow;
  212.     short                    part;
  213.     long                    whichMenuItem;
  214.     
  215.     part = FindWindow(currEvent->where, &eventWindow);
  216.     
  217.     switch(part){
  218.         case inMenuBar:
  219.             AdjustMenus();
  220.             whichMenuItem = MenuSelect(currEvent->where);
  221.             err = HandleMenuItem( whichMenuItem);
  222.             break;
  223.  
  224.         case inDrag:
  225.             /* we need to notify the sequence grabber that the window has changed */
  226.             CastChangedWindowBefore( gCastRecord, false );
  227.             DragWindow( eventWindow, currEvent->where, &(*GetGrayRgn())->rgnBBox );
  228.             CastChangedWindowBefore( gCastRecord, true );
  229.             break;
  230.             
  231.         /* window related events are handled by the conference component */
  232.         default:        
  233.             break;
  234.     }
  235.  
  236.     return err;
  237. }
  238.  
  239. /*************************************************** 
  240.  HandleKeyDown 
  241. ****************************************************/
  242. ComponentResult    HandleKeyDown( EventRecord* currEvent ) {
  243.  
  244.     ComponentResult err = noErr;
  245.     long            whichMenuItem;
  246.     
  247.     if(currEvent->modifiers & cmdKey){
  248.         AdjustMenus();
  249.         whichMenuItem = MenuKey(currEvent->message & charCodeMask);
  250.         err = HandleMenuItem(whichMenuItem);
  251.     }
  252.  
  253.     return err;
  254. }
  255.  
  256. /*************************************************** 
  257.  HandleHighLevelEvent 
  258. ****************************************************/
  259. ComponentResult    HandleHighLevelEvent( EventRecord* currEvent) {
  260.  
  261.     ComponentResult err = noErr;
  262.     
  263.     AEProcessAppleEvent(currEvent);
  264.     
  265.     return err;
  266. }
  267.  
  268. /*************************************************** 
  269.  HandleDiskEvent 
  270. ****************************************************/
  271. ComponentResult    HandleDiskEvent( EventRecord*    currEvent ) {
  272.  
  273.     ComponentResult            err = noErr;
  274.     Point                    where;
  275.  
  276.     if(HiWord(currEvent->message)){
  277.         SetPt(&where, kDILeft, kDITop);
  278.         err = DIBadMount(where, currEvent->message);
  279.     }
  280.     
  281.     return err;
  282. }
  283.  
  284. /*************************************************** 
  285.  HandleMenuItem 
  286. ****************************************************/
  287. ComponentResult    HandleMenuItem( long    selection ) {
  288.  
  289.     ComponentResult err = noErr;
  290.     short            menuID = HiWord(selection);
  291.     short            menuItem = LoWord(selection);
  292.     
  293.     switch (menuID) {
  294.     
  295.         case kAppleMenuID:
  296.             err = HandleAppleMenu( menuItem );
  297.             break;
  298.         case kFileMenuID:
  299.             err = HandleFileMenu( menuItem );
  300.             break;
  301.         case kEditMenuID:
  302.             err = HandleEditMenu( menuItem );
  303.             break;
  304.         case kSettingsMenuID:
  305.             err = HandleSettingsMenu( menuItem );
  306.             break;
  307.         }
  308.         
  309.     HiliteMenu(0);
  310.     
  311.     return err;
  312. }
  313.  
  314. /*************************************************** 
  315.  HandleAppleMenu 
  316. ****************************************************/
  317. ComponentResult    HandleAppleMenu( short menuItem ) {
  318.  
  319.     ComponentResult err = noErr;
  320.     Str255            daName;
  321.  
  322.     switch (menuItem) {
  323.     
  324.         case kAboutMenuItem:
  325.             DoAboutBox();
  326.             break;
  327.             
  328.         default:            /* all non-About items in this menu are DAs */
  329.             GetItem(GetMHandle(kAppleMenuID), menuItem, daName);
  330.             OpenDeskAcc(daName);
  331.     }
  332.     
  333.     return err;
  334. }
  335.  
  336. /*************************************************** 
  337.  HandleFileMenu 
  338. ****************************************************/
  339. ComponentResult    HandleFileMenu( short menuItem ) {
  340.  
  341.     ComponentResult err = noErr;
  342.     
  343.     switch (menuItem) {
  344.     
  345.         case kCastMenuItem:
  346.             if (IsCasting( gCastRecord ))
  347.                 err = StopCasting( gCastRecord );
  348.             else
  349.                 err = StartCasting( gCastRecord, gCastName );
  350.             break;
  351.         case kQuitMenuItem:
  352.             err = kTimeToQuit;
  353.             break;
  354.         default:                    /* there shouldn't be any */
  355.             break;
  356.         }
  357.     
  358.     return err;
  359. }
  360.  
  361. /*************************************************** 
  362.  HandleEditMenu 
  363. ****************************************************/
  364. ComponentResult    HandleEditMenu( short menuItem ) {
  365.  
  366.     ComponentResult err = noErr;
  367.     Boolean            handled;
  368.     
  369.     handled = SystemEdit(menuItem-1);
  370.     
  371.     if (!handled ) /* if this is our edit... */
  372.         {
  373.         switch (menuItem) {
  374.         
  375.             case kCopyMenuItem:
  376.                 if ( FrontWindow() == gMainWindow )
  377.                     {
  378.                     Handle pic;
  379.                     
  380.                     err = CopyCast( gCastRecord, (PicHandle*)&pic );
  381.                     
  382.                     if ( pic && (err == noErr) )
  383.                         {
  384.                         HLock(pic);
  385.                         err = ZeroScrap();
  386.                         if (err == noErr)
  387.                             err = PutScrap(GetHandleSize(pic), 'PICT', *pic);
  388.                         DisposeHandle( pic);
  389.                         }
  390.                     }
  391.                 break;
  392.             default:    /* we only know how to copy now... */
  393.                 break;
  394.             }
  395.         }
  396.         
  397.     return err;
  398. }
  399.  
  400. /*************************************************** 
  401.  HandleSettingsMenu 
  402. ****************************************************/
  403. ComponentResult    HandleSettingsMenu( short menuItem ) {
  404.  
  405.     ComponentResult    err = noErr;
  406.     
  407.     switch (menuItem) {
  408.         case kNetworkSettingsItem:
  409.             err = DoNetworkSettings();
  410.             break;
  411.         case kVideoSettingsItem:
  412.             err = CastChannelSettings( gCastRecord, gVideoChannel );
  413.             break;
  414.         case kSoundSettingsItem:
  415.             err = CastChannelSettings( gCastRecord, gSoundChannel );
  416.             break;
  417.         case kEnableSoundItem:
  418.             break;
  419.         case kEnableVideoItem:
  420.             break;
  421.         default:    /* we only know how to copy now... */
  422.             break;
  423.         }
  424.         
  425.     return err;
  426. }
  427.  
  428. /*************************************************** 
  429.  AdjustMenus 
  430. ****************************************************/
  431. void AdjustMenus( void ) {
  432.  
  433.     StringHandle itemString;
  434.     MenuHandle    appleMenu = GetMHandle(kAppleMenuID);
  435.     MenuHandle    fileMenu = GetMHandle(kFileMenuID);
  436.     MenuHandle    editMenu = GetMHandle(kEditMenuID);
  437.     MenuHandle    settingsMenu = GetMHandle(kSettingsMenuID);
  438.     
  439.     EnableItem( appleMenu, kAboutMenuItem );
  440.     EnableItem( fileMenu, kQuitMenuItem );
  441.  
  442.     if ( FrontWindow() == gMainWindow )
  443.         {
  444.         EnableItem( editMenu, kCopyMenuItem );
  445.         }
  446.     else
  447.         {
  448.         DisableItem( editMenu, kCopyMenuItem );
  449.         }
  450.  
  451.     if (IsCasting( gCastRecord ))
  452.         itemString = GetString(kStopCastStringID);
  453.     else
  454.         itemString = GetString(kStartCastStringID);
  455.         
  456.     if ( gVideoChannel)
  457.         {
  458.         EnableItem( settingsMenu, kVideoSettingsItem );
  459.         CheckItem( settingsMenu, kEnableVideoItem, true );
  460.         }
  461.     else
  462.         {
  463.         DisableItem( settingsMenu, kVideoSettingsItem );
  464.         CheckItem( settingsMenu, kEnableVideoItem, false );
  465.         }
  466.  
  467.     if ( gSoundChannel )
  468.         {
  469.         EnableItem( settingsMenu, kSoundSettingsItem );
  470.         CheckItem( settingsMenu, kEnableSoundItem, true );
  471.         }
  472.     else
  473.         {
  474.         DisableItem( settingsMenu, kSoundSettingsItem );
  475.         CheckItem( settingsMenu, kEnableSoundItem, false );
  476.         }
  477.         
  478.     SetMenuItemText(fileMenu, kCastMenuItem, *itemString);
  479.     ReleaseResource( (Handle)itemString );
  480.     
  481.     DisableItem( editMenu, kUndoMenuItem );
  482.     DisableItem( editMenu, kCutMenuItem );
  483.     DisableItem( editMenu, kPasteMenuItem );
  484.     DisableItem( editMenu, kClearMenuItem );        
  485. }
  486.  
  487. /*************************************************** 
  488.  DoNetworkSettings 
  489. ****************************************************/
  490. ComponentResult DoNetworkSettings( void ) {
  491.  
  492.     DialogPtr    settingsDialog;
  493.     short        itemHit;
  494.     ComponentResult err;
  495.     Handle        item;
  496.     Boolean        wasCasting;
  497.  
  498.     settingsDialog = GetNewDialog(kNetworkSettingsID, nil, (WindowRef) -1);
  499.  
  500.     if (settingsDialog) {
  501.  
  502.         GetDialogItem(settingsDialog, kNameTextItem, nil, &item, nil);
  503.         SetDialogItemText(item, gCastName);
  504.         SetDialogDefaultItem(settingsDialog, kOKItem);
  505.         
  506.         do {
  507.             ModalDialog(nil, &itemHit);
  508.         } while (( itemHit != kOKItem ) && (itemHit != kCancelItem));
  509.         
  510.         if (itemHit == kOKItem)
  511.             {
  512.             wasCasting = IsCasting( gCastRecord );
  513.             
  514.             if (wasCasting)
  515.                 StopCasting( gCastRecord );
  516.             
  517.             GetDialogItemText(item, gCastName );
  518.             
  519.             SetWTitle( gMainWindow, gCastName );
  520.             
  521.             if (wasCasting)
  522.                 err = StartCasting( gCastRecord, gCastName );
  523.             }
  524.             
  525.         DisposeDialog(settingsDialog);
  526.     }
  527.     else
  528.         err = ResError();
  529.         
  530.     return err;
  531. }
  532.  
  533.  
  534.